package reflace;

import java.lang.reflect.Field;
import java.util.Map;
import java.util.HashMap;


/**
 * todo
 *
 * @author zhengshan
 * @Date 2023/5/6 15:41
 */
public class MapAndBeanUtils {
    /**
     * 传递任意一个bean对象，将此对象中的全部属性封装到map中
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public static Map<String,Object> beanToMap(Object bean) throws Exception{
        if(bean == null){
            return null;
        }
        Map<String,Object> resultMap = new HashMap<String,Object>();
        //1、获取bean字节码文件
        Class beanClass = bean.getClass();
        //2、通过字节码文件获取bean中所有字段
        Field[] fields = beanClass.getDeclaredFields();
        //3、分别取出字段的字段名和字段值(字段名作为key,字段值作为value)
        for (Field field : fields) {
            //如果某一属性被private修饰，需要通过暴力反射来获取
            field.setAccessible(true);
            //bean中的某一属性名
            String fieldName = field.getName();
            //bean中的某一属性值
            Object fieldValue = field.get(bean);
            resultMap.put(fieldName, fieldValue);
        }
        return resultMap;
    }

    /**
     * 传递一个没有属性值的bean对象,传递一个有数据的map，将map中的数据保存到bean中
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public static Object mapToBean(Map<String,Object> map,Object bean) throws Exception{
        try {
            if(map == null || bean == null){
                return null;
            }
            //1、获取bean对象的字节码文件
            Class beanClass = bean.getClass();
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                //2、获取key=value的数据记录
                String key = entry.getKey();
                Object value = entry.getValue();
                //3、通过字节码、key获取相应的Field对象
                Field field = beanClass.getDeclaredField(key);
                field.setAccessible(true);
                //4、将value值保存到bean对象的属性中
                field.set(bean, value);

            }
        } catch (NoSuchFieldException e) {
            System.out.println("map中的key与实体类中的属性名不匹配!");
        }
        return bean;
    }
}
